/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cliente;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.StringTokenizer;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 * Clase que crea los hilos para subir archivos al servidor
 * 
 * @author Carlos
 */
public class SubidaArchivoThread extends Thread {
    
    private String Usuario;
    private String Pass;
    private String IP;
    private JLabel estado;
    private String path;
    private String nombreArchivo;

    /**
     * Constructor de la clase
     * 
     * @param nuevoUsuario nombre del usuario que sube el archivo
     * @param passActual password del usuario
     * @param serverIp IP del servidor
     * @param barraEstado barra de progreso del archivo
     * @param pathArchivo ruta del archivo
     * @param nombreArchivo nombre del archivo
     */
    SubidaArchivoThread(String nuevoUsuario,String passActual, String serverIp, JLabel barraEstado, String pathArchivo, String nombreArchivo) {
        this.Usuario = nuevoUsuario;
        this.Pass = passActual;
        this.IP = serverIp;
        this.estado = barraEstado;
        this.path = pathArchivo;
        this.nombreArchivo = nombreArchivo;
    }
    
    /**
     * Crea el hilo para la subida
     */
    @Override
    public void run(){
        Socket socketCliente = null;
        String comando = "";
        String respuesta = "";
        try {
            socketCliente = new Socket(this.IP, 9999);
            PrintWriter salida = new PrintWriter(socketCliente.getOutputStream(), true);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));

            salida.println("<Usuario>"+this.Usuario+"</Usuario>");
            salida.println("<Clave>"+this.Pass+"</Clave>");

            respuesta = entrada.readLine();
            comando = entrada.readLine();
                       
            if (XmlParser.extraerContenido(respuesta).equals("Ok")) {
                int puerto = Integer.parseInt(XmlParser.extraerContenido(comando));
                salida.close();
                entrada.close();
                socketCliente.close();
                this.estado.setText("Conectado...");
                    try{
                        SubirArchivo(puerto);
                  }catch(Exception e){
                        System.out.println(e.getMessage());
                  }
                
            } else {
                System.out.println("El servidor envio el siguente mensaje");
            }
            

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * Sube el archivo al servidor
     * 
     * @param puerto el puerto para subida
     */
    private void SubirArchivo(int puerto) {
        int cuenta = 0;
        try {
                Socket socketServicio = new Socket(this.IP,puerto);
                PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
 //               String llego = entrada.readLine();
                    salida.println("<mensaje>Envio</mensaje>");
                    String llego = entrada.readLine();
                    salida.println(this.Usuario);
                    salida.println(this.nombreArchivo);
                    PrintStream envio = new PrintStream(socketServicio.getOutputStream());
                    FileInputStream origen = new FileInputStream(this.path);
                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = origen.read(buffer);
                        //llego = entrada.readLine();
                        if (len <= 0) {                                         
                            envio.close();
                            System.out.println("se mando completo");
                            break;
                        } else {
                            envio.write(buffer, 0, len);
                            cuenta = cuenta + 1024;
                            this.estado.setText(String.valueOf(cuenta));
                        }
                    }             
            } catch (IOException ex) {
                System.out.println("Se cayó");
                System.out.println(ex.getMessage());
            }
    }
    
}
